#ifndef ABSTRACTSignal_H
#define ABSTRACTSignal_H

#include "Global_Signal.h"
#include "Delegate.h"

/*!
 *	\class 	AbstractSignal()
 *	\brief	Classe virtuelle pure qui n'a pour but que d'autoriser le polymorphisme en permettant de stocker plusieurs
 *              délégués aux patrons différents (template) à l'intérieur d'un std::vector<AbstractSignal *>
 */

class AbstractSignal{
    public :

    int end;

    std::vector<AbstractDelegate *> Slots;  /*!< Slots (objet + méthode) qui s'éxécuteront lorsque le signal retournera "vrai"	*/

    AbstractSignal(){ end=0;};

    /*!
     *	\fn virtual void Run()
     *	\brief	Exécute toutes les méthodes connectés au délégués
     */

    virtual void Run();

    /*!
     * 	\fn virtual void Update()
     *	\brief 		Exécute la méthode signal du délégué, si cette dernière renvoie vrai,
     * 		 	toutes les méthodes des slots branché au signal seront exécutés
     */

    virtual void Update()=0;

    /*!
     * 	\fn Connect(int (Z::*apSlot), Z *aSlot)
     * 	\brief	Ajoute un slot (fonction qui devra s'éxécuter lorsque le signal renvera la valeur "vrai"),
            au délégué courant
     */

    virtual void Connect( AbstractDelegate * aSlot)
    {
        Slots.push_back(aSlot);
    }
    virtual void ClearSlots()
    {
        Slots.clear();
    }
};


#endif // ABSTRACTSignal_H
